/*
 * @Author: szx
 * @Date: 2022-03-21 13:06:05
 * @LastEditTime: 2022-03-21 15:23:44
 * @Description:
 * @FilePath: \leetcode\剑指offer\20\20.js
 */
/**
 * @param {string} s
 * @return {boolean}
 */
// var isNumber = function (s) {
//     s = s.trim();
//     if (s.length == 0) return false;
//     const num = Number(s);
//     if (Number.isNaN(num)) return false;
//     return typeof num;
// };

var isNumber = function (s) {
    console.log(s);
    let n = s.length;
    let i = 0;

    // // 去除前后空格
    while (i < n && s[i] == ' ') i++;
    // 全都是空字符串直接返回false
    if (i == n) false;
    while (i < n && s[n - 1] == ' ') n--;

    // 遇到第一个字符是正负号
    if (s[i] === '+' || s[i] === '-') i++;
    // 单独处理.num这种情况
    let flag = false;
    if (s[i] === '.') {
        flag = true;
        i++;
        // if (i == n || i == n - 1) return false;
        // i++;
        // while (s[i] >= '0' && s[i] <= '9') {
        //     i++;
        //     if (i == n) return true;
        //     flag = true;
        // }
    }
    if (i == n) return false;
    let tmp = i;
    // 处理 e|E|. 之前的整数
    while (s[i] != 'e' && s[i] != 'E' && (s[i] != '.' || flag)) {
        if (s[i] < '0' || s[i] > '9') return false;
        i++;
        if (i == n) {
            return true;
        }
    }
    // 如果 e|E|. 之前没整数，直接返回false
    if (i == tmp) return false;
    // 如果是e和E，还要判断后面有没有正负号
    if (s[i] == '.') {
        if (i == n - 1) return true;
        i++;
    }
    if (s[i] == 'e' || s[i] == 'E') {
        if (i == n - 1) return false;
        if (s[i + 1] == '+' || s[i + 1] == '-') i++;
        i++;
        if (i == n) return false;
    }
    // 判断e|E|.后面的整数
    while (s[i] >= '0' && s[i] <= '9') {
        i++;
        if (i == n) return true;
    }
    return false;
};

var isNumber = function (s) {
    console.log(s);
    const isFloat = () => {
        let front = false;

        if (isInt()) front = true;

        if (i == n) return true;
        if (s[i] == '.') {
            i++;
            if (!isInt() && !front) return false;
        } else if (!front) return false;
        return true;
    };
    const isInt = () => {
        const tmp = i;
        while (i < n && s[i] >= '0' && s[i] <= '9') {
            i++;
        }
        if (tmp == i) return false;
        return true;
    };
    let n = s.length;
    let i = 0;

    // // 去除前后空格
    while (i < n && s[i] == ' ') i++;
    // 全都是空字符串直接返回false
    if (i == n) false;
    while (i < n && s[n - 1] == ' ') n--;

    // 遇到第一个字符是正负号
    if (s[i] === '+' || s[i] === '-') i++;
    if (i == n) return false;
    if (!isFloat()) return false;
    // if (i == n) return false;
    if (s[i] == 'e' || s[i] == 'E') {
        i++;
        if (i == n) return false;
        if (s[i] === '+' || s[i] === '-') i++;
        if (i == n) return false;
        if (isInt() && i != n) {
            return false;
        }
    }
    if (i != n) return false;
    return true;
};

console.log(isNumber('e9'));
console.log(isNumber('1.431352e7'));
console.log(isNumber('.2e81'));
console.log(isNumber('+3.e3'));
console.log(isNumber('+3.'));
console.log(isNumber('3.'));
console.log(isNumber('.3'));
console.log(isNumber(' '));
console.log(isNumber('0'));
console.log(isNumber('e'));
console.log(isNumber('.'));
console.log(isNumber('       .1'));
// console.log(isNumber('+100'));
// console.log(isNumber('5e2'));
// console.log(isNumber('-123'));
// console.log(isNumber('3.1416'));
// console.log(isNumber('-1E-16'));
// console.log(isNumber('0123'));
// console.log('?');
// console.log(isNumber('12e'));
// console.log(isNumber('1a3.14'));
// console.log(isNumber('1.2.3'));
// console.log(isNumber('+-5'));
// console.log(isNumber('12e+5.4'));
